2. Entity Framework - CodeFirst


Posted by WayneCheng on 2021-03-13

關於 CodeFirst 本篇將討論以下幾個問題

1. 關於 .NET Core CLI & PowerShell

2. 透過 CodeFirst 從無到有建立資料庫


測試環境:

OS:Windows 10
IDE:Visual Studio 2019
MS SQL:SQL Server 2019 Linux
SSMS:Microsoft SQL Server Management Studio 18


1. 關於 .NET Core CLI & PowerShell

我們可以透過 .NET Core CLI (EF Core 命令列工具) & PowerShell (套件管理員主控台) 來操作 NuGet 套件的安裝與 Migrations 命令的操作。

官方建議

  • 使用 Visual Studio 時,請考慮使用 套件管理員主控台 代替 CLI 工具。
  • 如果不是使用 Visual Studio,建議改用 EF Core 命令列工具

1.1 PowerShell (套件管理員主控台)

[VisualStudio]→[工具]→[NuGet 套件管理員]→[套件管理員主控台]

安裝套件除了直接使用指令外,也可使用 NuGet 來安裝,主要用來進行 Migrations 指令操作,更多指令請參考 套件管理主控台

注意事項:

  1. 執行前會先建置起始專案,建置失敗會無法執行
  2. 套件管理員主控台中的預設專案要選擇要建立資料庫 Model 的專案

1.2 .NET Core CLI (EF Core 命令列工具)

[開始]→[命令提示字元]

開啟後可透過以下指令進行操作,更多指令請參考 .NET Core CLI

// 安裝通用工具
dotnet tool install --global dotnet-ef

// 更新通用工具
dotnet tool update --global dotnet-ef

// 安裝套件
dotnet add package Microsoft.EntityFrameworkCore.Design

// 確認安裝狀態
dotnet ef

2. 透過 CodeFirst 從無到有建立資料庫

接下來會實作在 .NET 5 中使用 EF Core 透過 CodeFirst 的方式建立資料庫,以下操作皆以

  1. NuGet 套件管理元
  2. PowerShell(套件管理主控台)
  3. 搭配 Entity Framework Core

2.1 在 NuGet 中安裝擴充套件

透過 NuGet 安裝三個 Entity Framework 主要套件

  • Entity Framework Core
Microsoft.EntityFrameworkCore
  • Database Provider,這邊使用的是 MSSQL
Microsoft.EntityFrameworkCore.SqlServer

EF Core Database Provider 列表:MSDN Database Provider

  • 指令工具,安裝後才能操作 Migrations 指令
Microsoft.EntityFrameworkCore.Tools

2.2 建立 Model

依據資料庫欄位設計建立相對應的 Model,這邊設計了一個 User (使用者) 的 Model,包含兩個欄位

  1. Id
  2. Name (使用者名稱)

Entity Framework Core 會預設將 ID 或 classnameID 作為主索引鍵

public class User
{
    // EF Core 預設會解譯名為 ID 或 classnameID 作為主索引鍵的屬性
    // 這邊的話就會是 Id 或 UserID
    public int Id { get; set; }
    public string Name { get; set; }
}

2.2 建立 OOOContext

這邊的 OOOContext 命名通常會以 [DB Name]Context 或是直接使用 [DB Name] 的方式來命名。

Entity Framework Core 會透過自定義的 Context 內容來建立資料表與欄位間關聯,細節可參考下一篇,我們先單純以建立 Users 這張資料表來說明,需要注意以下幾個部分

  1. 繼承 DbContext
  2. 建構子參數(MSDN DbContext Class)
  3. 欲建立的資料表與細部關聯定義
// 繼承 DbContext
public class DataContext : DbContext
{
    // 建構子參數 DbContextOptions<T> 並傳入父類別
    public DataContext(DbContextOptions<DataContext> options)
        : base(options)
    {
    }

    // 一般習慣在 Model 命名使用單數,這邊資料表命名使用複數
    public DbSet<User> Users { get; set; }
}

2.3 Startup 中加入連線資訊

連線字串可以參考 MSDN 連接字串語法

連線字串中的「Catalog=[DB_Name]」會在資料庫不存在時以此名稱建立資料庫

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();

    // 加入連線資訊 & 將 DataContext 加入 DI 容器中
    // 以下連線字串請將 [ ] 中的內容自行替換
    var connectionString = @"Persist Security Info=False;User ID=[loginId];Password=[Password];Initial Catalog=[DB_Name];Server=[DB_IP]";
    services.AddDbContext<DataContext>(options => options.UseSqlServer(connectionString));
}

2.4 建立 Migrations

[VisualStudio]→[工具]→[NuGet 套件管理員]→[套件管理員主控台]

// EF6:
Enable-migrations

// EF Core:
Add-Migration InitialCreate

執行完後會看到以下訊息

Build started...
Build succeeded.
To undo this action, use Remove-Migration.

接著可以在專案中找到自動建立名為 Migrations 的目錄,並有一些自動產生的檔案,關於 Migrations 的內容會在下篇再詳細說明,到此建立資料庫的準備已大致完成。

2.4 建立資料庫

[VisualStudio]→[工具]→[NuGet 套件管理員]→[套件管理員主控台]

// 將異動更新至資料庫
Update-database

執行完後會看到以下訊息

Build started...
Build succeeded.
Done.

此時已將資料庫建置完畢,在資料庫中可以看到我們建立好的資料表

2.5 查詢

這邊開始前我們先在資料庫中新建幾筆測試資料

Id Name
1 Wayne
2 Leo
3 Henry

接著在 Constructor 中注入 DataContext

public class HomeController : Controller
{
    private readonly DataContext _dataContext;

    public HomeController(DataContext dataContext)
    {
        _dataContext = dataContext;
    }
{

取得資料

var data = _dataContext.Users.ToList();

完整程式碼

GitHub:CodeFirst


總結

本篇主要是說明 Code First 從無到有建立資料庫的過程,實際應用上情況會複雜許多,包含資料表與欄位間複雜的關聯與進退版等問題,這些會在後續詳加說明。


參考資料

  1. 套件管理主控台
  2. .NET Core CLI
  3. MSDN Database Provider
  4. MSDN 連接字串語法

新手上路,若有錯誤還請告知,謝謝


#.NETCore #Database #MSSQL #EntityFramework







Related Posts

部署 (1) —— 建立 AWS EC2 主機及 SSH 連線

部署 (1) —— 建立 AWS EC2 主機及 SSH 連線

很隨興的 Final project 心得

很隨興的 Final project 心得

一起來了解 Web Authentication

一起來了解 Web Authentication


Comments